package com.x;

import java.util.ArrayList;
import java.util.List;

public class Solution {
    public static List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> res = new ArrayList<>();
        int i = 0, j = 0;
        int startX = 0, startY = 0;
        int loop = 1;
        int offend = 1;
        int n = matrix[0].length;  // 列数
        int m = matrix.length;     // 行数

        while (loop <= Math.min(m, n) / 2) {
            for(j=startY;j<n-offend;j++){
                res.add(matrix[startX][j]);
            }
//            这里需要加startX的原因在于，startX已经更新了！！
            for(i=startX;i<m-offend;i++){
                res.add(matrix[i][j]);
            }
            for(;j>startY;j--){
                res.add(matrix[i][j]);
            }
            for(;i>startX;i--){
                res.add(matrix[i][j]);
            }
            startX++;
            startY++;
            loop++;
            offend++;
        }
        // 处理剩余的单行或单列
        // 每次处理完一圈之后，行或列都会删除两个元素，所以如果有一个为奇，肯定需要补
        if (Math.min(m, n) % 2 != 0) {
            if (m >= n) {
                // 只有一列未处理
                for (i = startX; i < m - offend + 1; i++) {
                    res.add(matrix[i][startY]);
                }
            } else {
                // 只有一行未处理
                for (j = startY; j < n - offend + 1; j++) {
                    res.add(matrix[startX][j]);
                }
            }
        }

        return res;
    }
}
